一、子类的构造、析构、拷贝
	1.子类的构造在执行它的构造函数前会根据继承表的顺序执行父类的构造函数。
			默认执行父类的无参构造。
			显式调用有参构造，在子类的构造函数后，初始化列表中显式调用父类的有参构造函数。
			
	2.子类在析构函数执行完后会根据继承表的顺序，逆序执行父类的析构函数
			
			注意： 父类的指针可以指向子类对象，当通过父类指针释放对象时，只会调用父类的析构函数，而这种析构方式有可能会造成内存泄漏。
	
	3.当使用子类对象来初始化新的子类对象时，会自动调用子类缺省的拷贝构造函数，并且会先调用父类缺省的拷贝构造函数
			如果子类中实现的拷贝构造，需要显式调用父类拷贝构造，否则就会调用无参构造。
	
	
	
二、私有继承、保护继承
	1. 私有继承
	使用private方式继承父类，公开的成员在子类中会变成私有的，其余的不变,这种继承方式防止父类的成员扩散。
	
	
	使用protected方式继承父类，公开的成员在子类中会变成保护的，其余的不变，这种继承方式可以有限防止父类的成员扩散。

	子类以私有或保护方式继承父类，禁止向上造型(子类的指针或引用不能隐式转换成父类的指针或引用，要想实现多态只能以公开方式继承父类)。
	
	
	
三、多重继承、钻石继承、虚继承
	1. 多重继承
	在C++中一个子类可以有多个父类，在继承表中按照顺序继承多个父类中的属性和行为，并按照顺序表中的调用父类的构造函数。
	按照从低到高的地址顺序排列父类，子类中会标记每一个父类的存储位置

	当子类指针隐式转换成父类的时候。编译器会自动计算父类中的内存所在子类中的位置，地址会自动进行偏移计算。

	2. (多重继承可能会造成)名字冲突
		可以正常继承，但如果直接访问，会造成歧义，不能直接访问，(域限定符)类名::成员名 进行访问
		
		
		
	3.钻石继承	
	假如有一个类A，类B继承类A，类C也继承类A，然后类D继承B和C
	
	一个子类继承多个父类，这多个父类又有一个共同的祖先
	
	注意： 钻石继承不会导致继承错误，但访问祖先类中的成员时，每次都需要使用域限定符 类名::成员名，重点是这种继承会造成冗余。
	
	
	4.虚继承  virtual
	当进行钻石继承时，祖先类中的内容会有冗余，而进行虚继承后，在子类中的内容只会保留一份。
	注意：但使用虚继承时子类中会多了一些内容。(指向从祖先类继承来的成员)
	
	5.构造函数 
	
	一旦进行了虚继承(钻石)祖先类的构造函数只执行一次。由孙子类直接调用，祖先类的有参构造也需要在孙子类中显式调用。
	
	6.拷贝构造

	在虚继承(钻石)中祖先的拷贝构造也由孙子类直接调用，子类中不再调用祖先类的拷贝构造，在手动实现的拷贝构造时(深拷贝)，祖先类中的内容也由孙子类负责拷贝，同理赋值构造也一样。	
	
	
	
四、虚函数、覆盖、多态
	1.虚函数
	类的成员函数前加 virtual这种函数就叫做虚函数
	
	2.覆盖 ()
	在子类会覆盖父类的虚函数。
	
	3.多态
	当子类覆盖了父类的虚函数时，通过父类指针指向子类对象时，调用虚函数，会根据具体的对象是谁来决定执行谁的函数，这就是多态。
	
	
	

五、覆盖和多态的条件
	1.	覆盖的条件
		必须是成员函数
		必须是虚函数
		必须是父子类之间
		函数签名必须相同(参数列表完全一致，const属性也会影响覆盖的结果)
		返回值必须是同类型或父子类类(子类的返回值要能向父类隐式转换)

		访问属性不影响覆盖
		常函数属性也会影响覆盖
		
	

	2. 重载 隐藏 覆盖(重写)的区别
	重载  在同一作用域下，函数名相同，参数列表不同的函数，构成重载关系 
	
	隐藏  父子类之间同名成员没有形成覆盖，且能通过编译，必定构成隐藏
	
	覆盖  父子类之间 必须是虚函数 函数签名必须相同 返回值必须是同类型或父子类类

	3.多态的条件
		1. 父子类之间有的函数有覆盖关系。
		2. 父类的指针或引用指向子类的对象。
	
	4.在构造、析构函数中调用
		在父类的构造函数中调用虚函数，此时子类还没有创建完成。(构造函数的创建过程。)因此只能调用父类的虚函数，而不是覆盖版本。
		
		在父类的析构函数中调用虚函数，此时子类已经释放完成，因此只能调用父类的虚函数，而不是覆盖版本。
		
		
		
	
六、纯虚函数和抽象类
	1.纯虚函数
		在虚函数的声明后面 =0， 这种虚函数就叫纯虚函数。可以不实现。
		但如果实现必须在类外(只能在父类的构造函数、析构函数)。
		virtual 返回值 函数名(参数列表)=0;
	


	
	2.抽象类
		成员函数中有虚函数，这种类叫抽象类，抽象类不能实例化(不能创建对象)
	
		
		抽象类必须被继承且纯虚函数被覆盖后，由子类实例化对象
		如果继承抽象类，但没有覆盖纯虚函数，那么子类也将成为抽象类，也不能创建实例化。
	
	
	
	3.纯抽象类
		所有成员函数都是纯虚函数，这种只能被继承的类叫纯抽象类。
		这种类一般用来设计接口，这种类在子类被替换后不需要修改或少量的修改即可继续使用。
	
	
酒店管理系统：
	
前提：
	(初始化)楼层，房间编号，房间类型，价格	
	开房：姓名，房间，随行人员，押金
	续费：延时 修改类型
	退房：押金 消费
	
	
	
	
	
	